Dynamic Billiards

By the Billard ballers

Chaotic Systems History

TODO

Overview of Chaotic Systems: A Descent into Chaos

In order for a Dynamical system to be classified as chaotic it must:

  1. Be sensitive to initial conditions
  2. Be topologically mixing
  3. Have dense periodic orbits

Sensitivity to Initial Conditions

  • A driven damped linear oscillator approaches a unique attractor regardless of the initial conditions.
  • The difference in solutions Z(x,t), with differing initial conditions, can be expressed as:$$\mid \Delta Z \mid=e^{Æ› t} \mid \Delta Z_0 \mid$$
  • As $t \rightarrow \infty$ the transient solutions die out, so Æ› must be negative
  • Any Errors in the initial conditions will decay.

Sensitivity to Initial Conditions

  • Nonlinear dynamic systems can have many attractors, each of which depends on the initial conditions.
  • The difference in solutions of nonlinear systems with differing initial conditions, can also be expressed as:$$\mid \Delta Z \mid=e^{Æ› t} \mid \Delta Z_0 \mid$$
  • As $t \rightarrow \infty$ the, Æ› no longer must be negative
  • Chaotic systems are all nonlinear

Sensitivity to Initial Conditions

$$\mid \Delta Z \mid=e^{Æ› t} \mid \Delta Z_0 \mid$$
  • Æ› is called the Lyapunov exponent
  • Æ› is positive in a chaotic system
  • So solutions with different initial conditions will diverge exponentially as time passes
  • So any errors in the initial conditions will grow exponentially with time. This is what is meant by a sensitivity to initial conditions

Topologically Mixing

Definition: A dynamical system $f$ on a phase space $X$ is said to be topologically mixing if for every two open sets $A$ and $B$ in $X$, there is $N$ sufficiently large such that $f^n(A)\cap B \neq \varnothing$ for all $n \geq N$.

  • By Iterating $f$ over any subset of the phase space we can make two different subsets eventually overlap
  • This means that any two different trajectories will become arbitrarily regardless of initial conditions

Dense Periodic Orbits

  • Any orbits appearing to be periodic are actually arbitrarily close to, but not repeating
  • The union of the sets of all these orbits forms the phase space title

Physics of the Simulation

  • Can be represented as by using a infinite potential well
  • Infinite on the boundary and zero inside
  • No loss of speed due to friction
  • Specular reflection

Can use either Hamiltonian or Lagrangian

Simulation Solutions

  • Instead of solving the equations of motion in our simulation we used graphing methods
  • Plot a straight line and solve for the intersection with the boundary
  • Determine the velocity vectors in the tangent and normal basis
  • Flip the sign of the normal velocity component
  • repeat

Rectangle Stadium

Periodicity of paths

Rational velocities

In [1]:
import RectTable as rect
from IPython.display import HTML

videoLength=1200

simargs={}
simargs['balls']={0:[0.5,0.5,1.5,0.5]}
simargs['playbackSpeed']=60
simargs['trace']=True
simargs['width']=2
simargs['height']=2
simargs['nBalls']=1
simargs['friction']=False

simulation=rect.RectTable(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[1]:

Rectangle Stadium

Periodicity of Paths

Irrational Velocities

In [2]:
simargs['balls'][0]=[0.5,0.5,1.5*2**(1/2),0.5]
simulation=rect.RectTable(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[2]:

Rectangle Stadium

Sensitivity to initial conditions

In [3]:
simargs['balls']={0:[1,0.7,1.5,0.7],1:[1,0.7,1.51,0.7]}
simargs['nBalls']=2
simulation=rect.RectTable(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[3]:

Rectangle Stadium

Topological Mixing

In [4]:
import random
nballs=30
simargs['trace']=False
simargs['nBalls']=nballs
for i in range(nballs+1):
    
    simargs['balls'][i] = [1.5, 0.75, 1, 0.7]

    # TODO: change this later after we figure out proper initial ball locations
    simargs['balls'][i][2] += random.uniform(-0.1, 0.1)
    simargs['balls'][i][3] += random.uniform(-0.1, 0.1)
    
simulation=rect.RectTable(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[4]:

Buminovich Stadium

Sensitivity to initial conditions

In [5]:
import Buminovich

simargs['balls']={0:[1,0.7,1.5,0.7],1:[1,0.7,1.501,0.7]}
simargs['nBalls']=2
simargs['trace']=True
simulation=Buminovich.Buminovich(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[5]:

Buminovich Stadium

Topological Mixing

In [6]:
nballs=30
simargs['trace']=False
simargs['nBalls']=nballs
for i in range(nballs+1):
    
    simargs['balls'][i] = [1.5, 0.75, 1, 0.7]

    # TODO: change this later after we figure out proper initial ball locations
    simargs['balls'][i][2] += random.uniform(-0.1, 0.1)
    simargs['balls'][i][3] += random.uniform(-0.1, 0.1)
    
simulation=Buminovich.Buminovich(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[6]:

Circle Stadium

Periodicity of Paths

In [7]:
import circle

simargs['balls']={0:[0.5,0.5,1.5,0.5]}
simargs['nBalls']=1
simargs['trace']=True

simulation=circle.CircleTable(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[7]:

Circle Stadium

Sensitivity to initial conditions

In [8]:
simargs['balls']={0:[1,0.7,1.5,0.7],1:[1,0.7,1.51,0.7]}
simargs['nBalls']=2
simargs['trace']=True

simulation=circle.CircleTable(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[8]:

Circle table

Topological Mixing

In [9]:
nballs=30
simargs['trace']=False
simargs['nBalls']=nballs
for i in range(nballs+1):
    
    simargs['balls'][i] = [1.5, 0.75, 1, 0.7]

    # TODO: change this later after we figure out proper initial ball locations
    simargs['balls'][i][2] += random.uniform(-0.1, 0.1)
    simargs['balls'][i][3] += random.uniform(-0.1, 0.1)
    
simulation=circle.CircleTable(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[9]:

Lorentz Gas

The billiard arises from studying the behavior of two interacting disks bouncing inside a square, reflecting off the boundaries of the square and off each other.

Sensitivity to initial conditions

In [10]:
import Lorentz
simargs['balls']={0:[1,0.7,1.5,0.7],1:[1,0.7,1.501,0.7]}
simargs['nBalls']=2
simargs['trace']=True

simulation=Lorentz.Lorentz(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[10]:

Lorentz Gas

Topological Mixing

In [11]:
nballs=30
simargs['trace']=False
simargs['nBalls']=nballs
for i in range(nballs+1):
    
    simargs['balls'][i] = [1.5, 0.75, 1, 0.7]
    simargs['balls'][i][2] += random.uniform(-0.1, 0.1)
    simargs['balls'][i][3] += random.uniform(-0.1, 0.1)
    
simulation=Lorentz.Lorentz(**simargs)
ani=simulation.main(videoLength)
HTML(ani.to_html5_video())
Out[11]:
In [ ]: